/**
 * This is a simple calculator
 */
package com.test1;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;


/**
 * @author 远光/lusheldon
 *
 */
public class Calcul extends JFrame implements ActionListener{
    JPanel[] jp=new JPanel[5];			//5 panels
	JTextField jtf=null; 				//show field
	JButton[] jb=new JButton[16];		//16 buttons
	private boolean calFlag=false;
	private boolean zeroFlag=true;
	private boolean floatFlag=false;
	private boolean error=false;
	private int iValue=0;
	private float fValue=0;
	private String op="+";
	private String ss=null;
	
	Calcul(){
		//initialize
		for(int i=0;i<5;i++){
			jp[i]=new JPanel();
		}
		jtf=new JTextField(16);
		jtf.setText("0");
		for(int i=0;i<10;i++){
			jb[i]=new JButton(String.valueOf(i));
		}
		jb[10]=new JButton(".");
		jb[11]=new JButton("+");
		jb[12]=new JButton("-");
		jb[13]=new JButton("*");
		jb[14]=new JButton("/");
		jb[15]=new JButton("=");
		
		//Layout
		this.setLayout(new GridLayout(5,1));
		jp[0].add(jtf);
		jp[1].add(jb[1]);
		jp[1].add(jb[2]);
		jp[1].add(jb[3]);
		jp[1].add(jb[11]);
		jp[2].add(jb[4]);
		jp[2].add(jb[5]);
		jp[2].add(jb[6]);
		jp[2].add(jb[12]);
		jp[3].add(jb[7]);
		jp[3].add(jb[8]);
		jp[3].add(jb[9]);
		jp[3].add(jb[13]);
		jp[4].add(jb[15]);
		jp[4].add(jb[0]);
		jp[4].add(jb[10]);
		jp[4].add(jb[14]);
		this.add(jp[0]);
		this.add(jp[1]);
		this.add(jp[2]);
		this.add(jp[3]);
		this.add(jp[4]);
		this.setTitle("计算器");
		this.setSize(200,200);
	//	this.setResizable(false);
		this.setVisible(true);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		for(int i=0;i<16;i++){
			jb[i].addActionListener(this);
			jb[i].setActionCommand(jb[i].getText());
		}
	}
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Calcul cal=new Calcul();
	}
	@Override
	public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub
		String s=e.getActionCommand();
		String str=jtf.getText();
		jtf.setText(getStr(str,s));
//		System.out.println(jtf.getText());
	}
	
	public String getStr(String str, String s){
		if(error==false){
			switch(s){
			case "0":
				zeroFlag=true;
			case "1":
			case "2":
			case "3":
			case "4":
			case "5":
			case "6":
			case "7":
			case "8":
			case "9":
				if(zeroFlag==true){
					if(floatFlag==true){
						str=str+s;
					}
					else
						str=s;
					zeroFlag=false;
				}else if(zeroFlag==false){
					if(calFlag==false)
						str=str+s;
					else{
						if(floatFlag==true)
							str=str+s;
						else 
							str=s;
						calFlag=false;
					}
				}
				break;
			case ".":
				if(zeroFlag==true)
					zeroFlag=true;
				floatFlag=true;
				str=str+s;
				break;
			case "+":
			case "-":
			case "*":
			case "/":
				if(calFlag==false){
					ss=str;
					calFlag=true;
					op=s;
					getValue(ss);
					str=s;
				}
				break;
			case "=":
				zeroFlag=true;
				ss=str;
				getValue(ss,op);
				if(floatFlag==true){
					str=String.valueOf(fValue);
					floatFlag=false;
				}else
					str=String.valueOf(iValue);
				break;
			}
		}else
			str="Error";
		return str;
	}
	private void getValue(String str){
		try{
			if(floatFlag==true){
				fValue=Float.valueOf(str).floatValue();
				zeroFlag=false;
			}else{
				iValue=Integer.valueOf(str).intValue();
				fValue=(float)iValue;
				zeroFlag=false;
			}
		}catch(Exception e){
			e.printStackTrace();
		}
	}
	private void getValue(String str,String s) {
		// TODO Auto-generated method stub
		try{
			
			switch(s){
			case "+":
				if(floatFlag==true){
					fValue+=Float.valueOf(str).floatValue();
				}else{
					System.out.println(str);
					iValue+=Integer.valueOf(str).intValue();
				}
				break;
			case "-":
				if(floatFlag==true){
					fValue-=Float.valueOf(str).floatValue();
				}else{
					iValue-=Integer.valueOf(str).intValue();
				}
				break;
			case "*":
				if(floatFlag==true){
					fValue*=Float.valueOf(str).floatValue();
				}else{
					iValue*=Integer.valueOf(str).intValue();
				}
				break;
			case "/":
				if(zeroFlag==false){
					if(floatFlag==true){
						fValue/=Float.valueOf(str).floatValue();
					}else{
						iValue/=Integer.valueOf(str).intValue();
					}
				}else{
					System.out.println("/ by zero");
					error=true;
				}
				break;	
			default:
				if(floatFlag==true){
					fValue=Float.valueOf(str).floatValue();
				}else{
					iValue=Integer.valueOf(str).intValue();
				}
			}
		}catch(Exception e){
			e.printStackTrace();
		}
	}
}
